#ifndef BUTTON_MANAGER_H
#define BUTTON_MANAGER_H

#include <Arduino.h>
#include "led_manager.h"
#include "wifi_manager.h"

// 前向声明
class SerialCommandHandler;
class LEDControlCenter;

// 按钮状态枚举
enum ButtonState {
  BUTTON_IDLE,          // 空闲状态
  BUTTON_PRESSED,       // 按下状态
  BUTTON_HELD,          // 长按状态
  BUTTON_RELEASED       // 释放状态
};

// 按钮事件枚举
enum ButtonEvent {
  EVENT_NONE,           // 无事件
  EVENT_SHORT_PRESS,    // 短按事件
  EVENT_LONG_PRESS_3S,  // 长按3秒事件（系统开关）
  EVENT_LONG_PRESS_10S  // 长按10秒事件（WiFi重置）
};

class ButtonManager {
private:
  // 硬件引脚
  uint8_t buttonPin;
  
  // 依赖组件引用
  LEDManager* ledManager;
  LEDControlCenter* ledControlCenter;
  WiFiManager* wifiManager;
  SerialCommandHandler* serialCommandHandler;
  
  // 全局状态变量引用
  bool* systemPowerEnabled;
  bool* isDrawingActive;
  bool* isDrawingPaused;
  
  // 按钮状态和时间变量
  ButtonState currentState;
  unsigned long buttonPressStart;
  unsigned long lastButtonPress;
  unsigned long lastSecondPrompt;  // 移动静态变量到实例变量
  bool buttonPressed;
  
  // 触发标志
  bool wifiResetTriggered;
  bool systemPowerTriggered;
  bool longPressLogShown;  // 长按日志是否已显示
  
  // WS2812临时启用相关
  bool ws2812OriginalState;
  bool ws2812TemporarilyEnabled;
  
  // 稳定性增强
  uint8_t consecutiveReadings;     // 连续相同读取次数
  bool lastReadingState;           // 上次读取状态
  unsigned long stateChangeTime;   // 状态改变时间
  
  // 时间常量
  static const unsigned long DEBOUNCE_DELAY = 50;             // 防抖延时50ms (更合理的防抖时间)
  static const unsigned long STABLE_READINGS = 3;             // 需要3次连续相同读取确认状态
  static const unsigned long SHORT_PRESS_MIN_TIME = 50;       // 短按最小时间50ms
  static const unsigned long SHORT_PRESS_MAX_TIME = 500;      // 短按最大时间500ms
  static const unsigned long SYSTEM_POWER_HOLD_TIME = 3000;   // 长按3秒触发系统开关
  static const unsigned long WIFI_RESET_HOLD_TIME = 10000;    // 长按10秒触发WiFi重置
  static const unsigned long MAX_PRESS_TIME = 15000;          // 最大按键时间15秒（溢出保护）
  static const unsigned long PROMPT_INTERVAL = 1000;          // 提示间隔1秒
  
  // 内部方法
  bool readButtonWithDebounce();      // 防抖读取按钮状态
  void handleButtonPress();
  void handleButtonRelease(unsigned long pressDuration);
  void handleLongPress(unsigned long pressDuration);
  void resetButtonState();
  bool isSystemEnabled();
  bool validatePointers();            // 验证关键指针
  unsigned long safeTimeDiff(unsigned long start, unsigned long end);  // 安全时间差计算
  
  // 事件处理方法
  void onShortPress();
  void onSystemPowerToggle();
  void onWiFiReset();
  
  // LED临时控制
  void enableTemporaryWS2812();
  void restoreWS2812State();
  
public:
  ButtonManager(uint8_t pin, LEDManager* led, WiFiManager* wifi, 
                bool* sysPower, bool* drawingActive, bool* drawingPaused);
  ~ButtonManager();
  
  // 初始化
  void begin();
  
  // 主循环处理
  void update();
  
  // 状态查询
  ButtonState getState() const { return currentState; }
  bool isPressed() const { return buttonPressed; }
  unsigned long getPressStartTime() const { return buttonPressStart; }
  unsigned long getPressDuration() const;
  
  // 设置方法
  void setLEDManager(LEDManager* led) { ledManager = led; }
  void setLEDControlCenter(LEDControlCenter* center) { ledControlCenter = center; }
  void setWiFiManager(WiFiManager* wifi) { wifiManager = wifi; }
  void setSerialCommandHandler(SerialCommandHandler* handler) { serialCommandHandler = handler; }
  
  // 调试方法
  void printStatus();
};

#endif // BUTTON_MANAGER_H
